/*
 *      Copyright 2008, M.B.I. srl.
 * 
 *      This program is free software; you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation; either version 3 of the License, or
 *      (at your option) any later version.
 *      
 *      This program is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *      
 *      You should have received a copy of the GNU General Public License
 *      along with this program; if not, write to the Free Software
 *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 *      MA 02110-1301, USA.
 */

#include <boost/python.hpp>
#include <stdexcept>
#include <sstream>
#include <new>

#include "OsiSolverInterface.hpp"
#include "OsiMskSolverInterface.hpp"
#include "pyOsiCommon.hpp"

using namespace boost::python;

OsiSolverInterface * getOsi() { return new OsiMskSolverInterface; }

void ChangeCoeffs( OsiSolverInterface * self, ptr_int & aRows , ptr_int & aCols, ptr_double & aVals )
{
    OsiMskSolverInterface* mySolver = dynamic_cast<OsiMskSolverInterface*>(self);
    
    MSKtask_t myTask = mySolver->getLpPtr();
    MSKintt myNum = aRows.length();
    #ifndef NDEBUG
    LOG_CALL
    if (!((myNum == aCols.length()) && (myNum == aVals.length()) ))
    {
        LOG_STREAM << "ERROR: Different vector lenghts" << std::endl;
    }
    #endif
    MSKrescodee myRes = MSK_putaijlist( myTask, myNum, aRows.ptr(), aCols.ptr(), aVals.ptr() );    
    #ifndef NDEBUG
    if (myRes != MSK_RESPONSE_OK )
    {
        LOG_STREAM << "ERROR: Response not OK" << std::endl;
    }
    #endif
}
    
// Binding
BOOST_PYTHON_MODULE(pyOsiMsk)
{
    def("getOsi", getOsi, return_value_policy<manage_new_object>());
    def("ChangeCoeffs", ChangeCoeffs );
}
